]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st-drawing-area: Draw content taking care of the resource_scale
authorMarco Trevisan (Treviño) <mail@3v1n0.net>
Mon, 31 Jul 2017 12:08:29 +0000 (14:08 +0200)
committerJonas Ådahl <jadahl@gmail.com>
Fri, 1 Mar 2019 17:12:52 +0000 (17:12 +0000)
https://bugzilla.gnome.org/show_bug.cgi?id=765011

src/st/st-drawing-area.c

index e8fc4f6d2521493a76a5743833140a01ae65ec10..f561759c6236af7d9c29c7fcfdc0adb3036fa33f 100644 (file)
@@ -35,6 +35,7 @@
 #include "st-drawing-area.h"
 
 #include <cairo.h>
+#include <math.h>
 
 typedef struct _StDrawingAreaPrivate StDrawingAreaPrivate;
 struct _StDrawingAreaPrivate {
@@ -84,12 +85,22 @@ st_drawing_area_allocate (ClutterActor          *self,
   ClutterContent *content = clutter_actor_get_content (self);
   ClutterActorBox content_box;
   int width, height;
+  float resource_scale;
+
+  if (!st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
+    {
+      ClutterActorBox empty = CLUTTER_ACTOR_BOX_INIT_ZERO;
+      clutter_actor_set_allocation (self, &empty, 0);
+      return;
+    }
 
   clutter_actor_set_allocation (self, box, flags);
   st_theme_node_get_content_box (theme_node, box, &content_box);
 
   width = (int)(0.5 + content_box.x2 - content_box.x1);
   height = (int)(0.5 + content_box.y2 - content_box.y1);
+
+  clutter_canvas_set_scale_factor (CLUTTER_CANVAS (content), resource_scale);
   clutter_canvas_set_size (CLUTTER_CANVAS (content), width, height);
 }
 
@@ -101,6 +112,16 @@ st_drawing_area_style_changed (StWidget  *self)
   st_drawing_area_queue_repaint (ST_DRAWING_AREA (self));
 }
 
+static void
+st_drawing_area_resource_scale_changed (StWidget *self)
+{
+  float resource_scale;
+  ClutterContent *content = clutter_actor_get_content (CLUTTER_ACTOR (self));
+
+  if (st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
+    clutter_canvas_set_scale_factor (CLUTTER_CANVAS (content), resource_scale);
+}
+
 static void
 st_drawing_area_class_init (StDrawingAreaClass *klass)
 {
@@ -109,6 +130,7 @@ st_drawing_area_class_init (StDrawingAreaClass *klass)
 
   actor_class->allocate = st_drawing_area_allocate;
   widget_class->style_changed = st_drawing_area_style_changed;
+  widget_class->resource_scale_changed = st_drawing_area_resource_scale_changed;
 
   st_drawing_area_signals[REPAINT] =
     g_signal_new ("repaint",
@@ -185,7 +207,7 @@ st_drawing_area_get_surface_size (StDrawingArea *area,
 {
   StDrawingAreaPrivate *priv;
   ClutterContent *content;
-  float w, h;
+  float w, h, resource_scale;
 
   g_return_if_fail (ST_IS_DRAWING_AREA (area));
 
@@ -195,8 +217,18 @@ st_drawing_area_get_surface_size (StDrawingArea *area,
   content = clutter_actor_get_content (CLUTTER_ACTOR (area));
   clutter_content_get_preferred_size (content, &w, &h);
 
+  if (st_widget_get_resource_scale (ST_WIDGET (area), &resource_scale))
+    {
+      w /= resource_scale;
+      h /= resource_scale;
+    }
+  else
+    {
+      w = h = 0.0f;
+    }
+
   if (width)
-    *width = (guint)w;
+    *width = ceilf (w);
   if (height)
-    *height = (guint)h;
+    *height = ceilf (h);
 }